package network;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {
    private Socket socket;

    public TcpEchoClient(String serverIpP, int serverPort) throws IOException {
        //这里写入IP和端口号后，意味着，new好对象之后和服务器的连接就建立完成了，如果建立连接失败，就会直接在构造对象时抛出异常
        socket = new Socket(serverIpP,serverPort);
    }

    public void start() {
        System.out.println("客户端启动！");
        try(InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream()) {
            Scanner scanner = new Scanner(inputStream);
            PrintWriter printWriter = new PrintWriter(outputStream);
            Scanner scannerIn = new Scanner(System.in);//此处是用户进行输入，补药将里面的参数写成inputStream了
            //System.in  System.out  System.error 这三个特殊的流对象的生命周期是跟随进程的结束而结束，不需要手动close
            while(true) {
                //1.从控制台读取数据
                System.out.print("-> ");
                String request = scannerIn.next();
                //2.把请求发送给服务器
                printWriter.println(request);//把请求放在内存的缓冲区里，如果此处的数据比较少，没办法堆积够足够的数据，则不会进行IO操作，这些数据也只会一直停留在缓存区中，出不去
                //PrintWriter这样的类，以及很多IO流中的类，都是自带缓存区的，引入缓存区后，进行写入操作，不会直接触发IO，而是先放到缓存区
                //等到混存取里面攒了一波之后，再统一进行发送
                printWriter.flush();
                //3.从服务器中获取响应
                if(!scanner.hasNext()) {
                    break;
                }
                String response = scanner.next();
                //4.打印响应结果
                System.out.println(response);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient tcpEchoClient = new TcpEchoClient("127.0.0.1",9090);
        tcpEchoClient.start();
    }
}
